﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.ApplicationModel.Resources.Core;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using System.Collections.Specialized;
using VNStories.VnStoriesService;
using Windows.Storage;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using Windows.Storage.Streams;

// The data model defined by this file serves as a representative example of a strongly-typed
// model that supports notification when members are added, removed, or modified.  The property
// names chosen coincide with data bindings in the standard item templates.
//
// Applications may use this model as a starting point and build on it, or discard it entirely and
// replace it with something appropriate to their needs.

namespace VNStories.Data
{
    /// <summary>
    /// Base class for <see cref="SampleDataItem"/> and <see cref="SampleDataGroup"/> that
    /// defines properties common to both.
    /// </summary>
    [Windows.Foundation.Metadata.WebHostHidden]
    [KnownType(typeof(SampleDataCommon))]
    [DataContractAttribute]
    public abstract class SampleDataCommon : VNStories.Common.BindableBase
    {
        private static Uri _baseUri = new Uri("ms-appx:///");

        public SampleDataCommon(String uniqueId, String title, String subtitle, String imagePath, String description)
        {
            this._uniqueId = uniqueId;
            this._title = title;
            this._subtitle = subtitle;
            this._description = description;
            this._imagePath = imagePath;
        }

        private string _uniqueId = string.Empty;
        [DataMember()]
        public string UniqueId
        {
            get { return this._uniqueId; }
            set { this.SetProperty(ref this._uniqueId, value); }
        }

        private string _title = string.Empty;
        [DataMember()]
        public string Title
        {
            get { return this._title; }
            set { this.SetProperty(ref this._title, value); }
        }

        private string _subtitle = string.Empty;
        [DataMember()]
        public string Subtitle
        {
            get { return this._subtitle; }
            set { this.SetProperty(ref this._subtitle, value); }
        }

        private string _description = string.Empty;
        [DataMember()]
        public string Description
        {
            get { return this._description; }
            set { this.SetProperty(ref this._description, value); }
        }

        private ImageSource _image = null;
        [DataMember()]
        private String _imagePath = null;
        
        public ImageSource Image
        {
            get
            {
                if (this._image == null && this._imagePath != null)
                {
                    this._image = new BitmapImage(new Uri(SampleDataCommon._baseUri, this._imagePath));
                }
                return this._image;
            }

            set
            {
                this._imagePath = null;
                this.SetProperty(ref this._image, value);
            }
        }

        public void SetImage(String path)
        {
            this._image = null;
            this._imagePath = path;
            this.OnPropertyChanged("Image");
        }

        public override string ToString()
        {
            return this.Title;
        }
    }

    /// <summary>
    /// Generic item data model.
    /// </summary>
    public class SampleDataItem : SampleDataCommon
    {
        public SampleDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content, SampleDataGroup group)
            : base(uniqueId, title, subtitle, imagePath, description)
        {
            this._content = content;
            this._group = group;
        }

        private string _content = string.Empty;
        public string Content
        {
            get { return this._content; }
            set { this.SetProperty(ref this._content, value); }
        }

        private SampleDataGroup _group;
        public SampleDataGroup Group
        {
            get { return this._group; }
            set { this.SetProperty(ref this._group, value); }
        }
    }

    /// <summary>
    /// Generic group data model.
    /// </summary>
    /// 
    [KnownType(typeof(SampleDataGroup))]
    [DataContractAttribute]
    public class SampleDataGroup : SampleDataCommon
    {
        public SampleDataGroup(String uniqueId, String title, String subtitle, String imagePath, String description)
            : base(uniqueId, title, subtitle, imagePath, description)
        {
            Items.CollectionChanged += ItemsCollectionChanged;
        }

        private void ItemsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            // Provides a subset of the full items collection to bind to from a GroupedItemsPage
            // for two reasons: GridView will not virtualize large items collections, and it
            // improves the user experience when browsing through groups with large numbers of
            // items.
            //
            // A maximum of 12 items are displayed because it results in filled grid columns
            // whether there are 1, 2, 3, 4, or 6 rows displayed

            switch (e.Action)
            {
                case NotifyCollectionChangedAction.Add:
                    if (e.NewStartingIndex < 12)
                    {
                        TopItems.Insert(e.NewStartingIndex,Items[e.NewStartingIndex]);
                        if (TopItems.Count > 12)
                        {
                            TopItems.RemoveAt(12);
                        }
                    }
                    break;
                case NotifyCollectionChangedAction.Move:
                    if (e.OldStartingIndex < 12 && e.NewStartingIndex < 12)
                    {
                        TopItems.Move(e.OldStartingIndex, e.NewStartingIndex);
                    }
                    else if (e.OldStartingIndex < 12)
                    {
                        TopItems.RemoveAt(e.OldStartingIndex);
                        TopItems.Add(Items[11]);
                    }
                    else if (e.NewStartingIndex < 12)
                    {
                        TopItems.Insert(e.NewStartingIndex, Items[e.NewStartingIndex]);
                        TopItems.RemoveAt(12);
                    }
                    break;
                case NotifyCollectionChangedAction.Remove:
                    if (e.OldStartingIndex < 12)
                    {
                        TopItems.RemoveAt(e.OldStartingIndex);
                        if (Items.Count >= 12)
                        {
                            TopItems.Add(Items[11]);
                        }
                    }
                    break;
                case NotifyCollectionChangedAction.Replace:
                    if (e.OldStartingIndex < 12)
                    {
                        TopItems[e.OldStartingIndex] = Items[e.OldStartingIndex];
                    }
                    break;
                case NotifyCollectionChangedAction.Reset:
                    TopItems.Clear();
                    while (TopItems.Count < Items.Count && TopItems.Count < 12)
                    {
                        TopItems.Add(Items[TopItems.Count]);
                    }
                    break;
            }
        }
        [DataMember()]
        private ObservableCollection<SampleDataItem> _items = new ObservableCollection<SampleDataItem>();
        public ObservableCollection<SampleDataItem> Items
        {
            get { return this._items; }
            set { _items = value; }
        }

        [DataMember()]
        private ObservableCollection<SampleDataItem> _topItem = new ObservableCollection<SampleDataItem>();
        public ObservableCollection<SampleDataItem> TopItems
        {
            get {return this._topItem; }
            set { _topItem = value; }
        }
    }

    /// <summary>
    /// Creates a collection of groups and items with hard-coded content.
    /// 
    /// SampleDataSource initializes with placeholder data rather than live production
    /// data so that sample data is provided at both design-time and run-time.
    /// </summary>
    public sealed class SampleDataSource
    {
        private static SampleDataSource _sampleDataSource = new SampleDataSource();

        private ObservableCollection<SampleDataGroup> _allGroups = new ObservableCollection<SampleDataGroup>();
        public ObservableCollection<SampleDataGroup> AllGroups
        {
            get { return this._allGroups; }
        }

        public static IEnumerable<SampleDataGroup> GetGroups(string uniqueId)
        {
            if (!uniqueId.Equals("AllGroups")) throw new ArgumentException("Only 'AllGroups' is supported as a collection of groups");
            
            return _sampleDataSource.AllGroups;
        }

        public static SampleDataGroup GetGroup(string uniqueId)
        {
            // Simple linear search is acceptable for small data sets
            var matches = _sampleDataSource.AllGroups.Where((group) => group.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public static SampleDataItem GetItem(string uniqueId)
        {
            // Simple linear search is acceptable for small data sets
            var matches = _sampleDataSource.AllGroups.SelectMany(group => group.Items).Where((item) => item.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public void Sample()
        {
            String ITEM_CONTENT =
                @"Ngày xưa, có Tấm và Cám là hai chị em cùng cha khác mẹ. Hai chị em gần bằng tuổi nhaụ Tấm là con vợ cả. Cám là con vợ lẽ. Mẹ Tấm đã chết từ hồi Tấm còn bé. Sau đó mấy năm thì cha Tấm cũng chết. Tấm ở với dì ghẻ và đó là người rất cay nghiệt. Ngày qua ngày, Tấm phải làm lụng luôn canh, hết chăn trâu, gánh nước, đến thái khoai, vớt bèo, đêm lại còn xay lúa giã gạo mà không hết việc. Trong khi đó thì Cám được mẹ nuông chiều, được ăn trắng mặc trơn, suốt ngày quanh quẩn ở nhà, không phải làm việc nặng.

Một hôm người dì ghẻ đưa cho hai chị em mỗi người một cái giỏ bảo ra đồng bắt con tôm con tép. Mụ ta hứa hẹn: 'Hễ đứa nào bắt được đầy giỏ thì thưởng cho một cái yếm đỏ'. Ra đồng, Tấm nhờ mò cua bắt óc đã quen nên chỉ một buổi là được đầy giỏ vừa cá vừa tép, còn Cám thì đủng đỉnh dạo hết ruộng nọ sang ruộngkiạ Mãi đến chiều vẫn không được gì.

Thấy Tấm bắt được một giỏ đầy, Cám bảo chị :

- Chị Tấm ơi, chị Tấm! Đầu chị lấm, chị hụp cho sâu, kẻo về dì mắng.

Tin là thật, Tấm bèn xuống ao lội ra chỗ sâu tắm rửạ Cám thừa dịp trút hết tép của Tấm vào giỏ của mình rồi ba chân bốn cẳng về trước. Lúc Tấm bước lên chỉ còn giỏ không, bèn ngồi xuống bưng mặt khóc hu hụ

Bấy giờ Bụt đang ngồi trên toà sen, bỗng nghe tiếng khóc của Tấm, liền hiện xuống hỏi :

- Con làm sao lại khóc ?

Tấm kể lể sự tình cho Bụt nghe, Bụt bảo:
- Thôi con hãy nín đi ! con thử nhìn vào giỏ xem còn có gì nữa không?

Tấm nhìn vào giỏ rồi nói :

- Chỉ còn một con cá bống.

- Con đem con cá bống ấy về thả xuống giếng mà nuôị Một bữa, đáng ăn ba bát thì con ăn hai còn một đem thả xuống cho bống. Một lần cho ăn con nhớ gọi như thế này :

Bống bống bang bang

Lên ăn cơm vàng cơm bạc nhà ta

Chớ ăn cơm hẩm cháo hoa nhà ngườị

- Không gọi đúng như thế thì nó không lên, con nhớ lấy !

Nói xong Bụt biến mất. Tấm theo lời Bụt thả bống xuống giếng. Rồi từ hôm ấy trở đi, cứ mỗi bữa ăn, Tấm đều để dành cơm, giấu đưa ra cho bống. Mỗi lần nghe bống gọi, bống lại ngoi lên mặt nước đớp những hạt cơm của Tấm ném xuống. Người và cá ngày một quen nhau, và bống ngày càng lớn lên trông thấỵ

Thấy Tấm sau mỗi bữa ăn thường mang cơm ra giếng, mụ gì ghẻ sinh nghi, bèn bảo Cám đi rình. Cám nấp ở bụi cây bên bờ giếng nghe Tấm gọi bống, bèn nhẩm lấy cho thuộc rồi về kể lại cho mẹ nghẹ

Tối hôm ấy mụ dì ghẻ bảo Tấm sáng mai dậy sớm chăn trâu, và dặn:

- Con ơi con! Làng đã bắt đầu cấm đồng rồi đấỵ Mai con đi chăn trâu, phải chăn đồng xa, chớ chăn đồng nhà, làng bắt mất trâụ 

Tấm vâng lời, sáng hôm sau đưa trâu đi ăn thật xạ ở nhà, mẹ con Cám mang bát cơm ra giếng cũng gọi bống lên ăn y như Tấm gọị Nghe lời gọi, bống ngoi lên mặt nước. Mẹ Cám đã chực sẵn, bắt lấy bống đem về nhà làm thịt.

Đến chiều Tấm dắt trâu về, sau khi ăn xong Tấm lại mang bát cơm để dành ra giếng, Tấm gọi nhưng chả thấy bống ngoi lên như mọi khị Tấm gọi mãi, gọi mãi, cuối cùng chỉ thấy cục máu nổi lên mặt nước. Biết là có sự chẳng lành cho bống, Tấm òa lên khóc. Bụt lại hiện lên hỏi:

- Con làm sao lại khóc ?

Tấm kể sự tình cho bụt nghe, Bụt bảo:

- Con bống của con, người ta đã ăn thịt mất rồị Thôi con hãy nín đi ! Rồi về nhặt xương nó, kiếm bốn cái lọ bỏ vào, đem chôn xuống dưới bốn chân giường con nằm.

Tấm trở về theo lời Bụt đi tìm xương bống, nhưng tìm mãi các xó vườn góc sân mà không thấy đâu cả. Một con gà thấy thế, bảo Tấm :

- Cục ta cục tác ! Cho ta nắm thóc, ta bưới xương cho !

Tấm bốc nắm thóc ném cho gà. Gà chạy vào bếp bới một lúc thì thấy xương ngaỵ Tấm bèn nhặt lấy bỏ vào lọ và đem chôn dưới chân giường như lời bụt dặn.

ít lâu sau nhà vua mở hội trong mấy đêm ngàỵ Già trẻ gái trai các làng đều nô nức đi xem, trên các nẻo đường, quần áo mớ ba mớ bẩy dập dìu tuôn về kinh như nước chảỵ Hai mẹ con Cám cũng sắm sửa quần áo đẹp để đi chẩy hộị Thấy Tấm cũng muốn đi, mụ dì ghẻ nguýt dài, sau đó mụ lấy một đấu gạo trộn lẫn với một đấu thóc, bảo Tấm: 

- Con hãy nhặt xong cho dì chỗ gạo này rồi có đi đâu hãy đi, đừng có bỏ dở, về không có gì để thổi cơm dì đánh đó.

Nói đoạn, hai mẹ con quần áo xúng xính lên đường. Tấm ngồi nhặt một lúc, thấy suốt ruột, nghĩ rằng không biết bao giờ mới nhặt xong, bèn ngồi khóc một mình. Giữa lúc ấy Bụt hiện lên hỏi:

- Con làm sao lại khóc?

Tấm chỉ vào cái thúng, thưa:

- Dì con bắt phải nhặt thóc ra thóc, gạo ra gạo, rồi mới được đi xem hội, lúc nhặt xong thì hội đã tan rồi còn gì mà xem.

Bụt bảo:

- Con đừng khóc nữạ Con mang cái thúng đặt ra giữa sân, để ta sai chim sẻ xuống nhặt giúp.

- Nhưng ngộ chim sẻ ăn mất thì khi về con vẫn cứ bị đòn.

- Con cứ bảo chúng nó thế này:

Rặt rặt (con chim sẻ ) xuống nhặt cho tao

¡n mất hạt nào thì tao đánh chết

Thì chúng nó sẽ không ăn của con đâu

Tự nhiên ở trên không có một đàn chim sẻ đáp xuống sân nhặt thóc ra một đằng, gạo ra một nẻọ Chúng nó lăng xăng ríu rít chỉ trong một lát đã làm xong, không suy suyển một hạt. Nhưng khi chim sẻ bay đi rồi, Tấm lại nức nở khóc. Bụt lại bảo: 

- Con làm sao lại khóc?

- Con rách rưới quá, người ta không cho con vào xem hộị

- Con hãy đào những cái lọ xương bống đã chôn ngày trước lên thì sẽ có đủ thứ cho con chẩy hộị

Tấm vâng lời, đi đào các lọ lên. Đào lọ thứ nhất lấy ra được một cái áo mớ ba, một cái áo xống lụa, một cái yếm lụa điều và một cái khăn nhiễụ Đào lọ thứ hai lấy ra được một đôi giầy thêụ Đào lọ thứ ba thì thấy một con ngựa bé tí, nhưng vừa đặt con ngựa xuông đất bỗng chốc nó đã hí vang lên và biến thành ngựa thật. Đào đến lọ cuối cùng thì lấy ra được một bộ yên cương xinh xắn.

Tấm mừng quá vội tắm rửa rồi thắng bộ vào, đoạn cưỡi lên ngựa mà đị Ngựa phóng một chốc đã đến kinh độ Nhưng khi phóng qua một một chỗ lội, Tấm đánh rơi một chiếc giầy xuống nước không kịp nhặt. Khi ngựa dừng lại ở đám hội, Tấm lấy khăn gói chiếc giầy còn lại rồi chen vào biển ngườị

Giữa lúc ấy thì đoàn xa giá vừa tiến đến chỗ lộị Hai con voi ngự dẫn đầu đoàn đến đấy tự nhiên cắm ngà xuống đất kêu rống lên, không chịu đị Vua sai quân lính xuống nước thử tìm xem, họ nhặt ngay được một chiếc giầy thêu của Tấm lúc nẫy đánh rơi xuống đó. Vua ngắm nghía chiếc giầy không chán mắt. Bụng bảo dạ:' Chà, một chiếc giầy thật xinh! Người đi giầy này hẳn phải là trang tuyệt sắc'.

Lập tức Vua hạ lệnh cho rao mời tất cả đám đàn bà con gái xem hội ướm thử, hễ ai đi vừa chiếc giầy thì vua sẽ lấy làm vợ. Đám hội lại càng náo nhiệt vì các bà, các cô chen nhau đến chỗ thử giầỵ Cô nào cô ấy lần lượt kéo vào ngồi lầu giữa bãi cỏ rộng để ướm một tí cầu maỵ Nhưng chẳng có một chân nào đi vừa cả. Mẹ con Cám trong số đó. Khi Cám và dì ghẻ bước ra khỏi lầu thì gặp Tấm, Cám mách mẹ:

- Mẹ ơi, ai như chị Tấm cũng đi thử giầy đấy!

Mụ dì ghẻ bĩu môi:

- Con nỡm, chuông khánh còn chẳng ăn ai nữa là mảnh chĩnh vứt ngoài bờ tre!

Nhưng khi Tấm đặt chân vào giầy thì vừa như in. Nàng mở khăn lấy luôn chiếc thứ hai đi vàọ Hai chiếc giầy giống nhau như đúc. Bọn lính hầu hò reo vui mừng. Lập tức vua sai đoàn tỳ nữ rước nàng vào cung. Tấm bước lên kiệu trước con mắt ngạc nhiên và hằn học của mẹ con Cám.

Tuy sống sung sướng trong hoàng cung. Tấm vẫn không quên ngày giỗ chạ Nàng xin phép vua trở về nhà để soạn cỗ cúng giúp dì. Mẹ con Cám thấy Tấm sung sướng thì ghen ghét để bụng. Nay thấy Tấm về, lòng ghen ghét lại bùng bốc lên. Nghĩ ra được một mưu, mụ dì ghẻ bảo Tấm:

- Trước đây con quen trèo cau, con hãy trèo lên xé lấy một buồng cau để cúng bố. 

Tấm vâng lời trèo lên cây cau, lúc lên đến sát buồng thì ở dưới này mụ dì ghẻ cầm dao đẵn gốc. Thấy cây rung chuyển, Tấm hỏi :

- Dì làm gì dưới gốc thế ?

- Gốc cau lắm kiến, dì đuổi kiến cho nó khỏi lên đốt con.

Nhưng Tấm chưa kịp xé cau thì cây cau đã đổ. Tấm ngã lộn cổ xuống ao chết. Mụ dì ghẻ vội vàng lột áo quần của Tấm cho con mình mặc vào cung nói dối với vua rằng Tấm không may bị rơi xuống ao chết đuối, nay đưa em vào để thế chị. Vua nghe nói trong bụng không vui, nhưng vẫn không nói gì cả.

Lại nói chuyên Tấm chết hoá thành chim vàng anh, chim bay một mạch về kinh đến vườn ngự. Thấy Cám đang giặt áo cho vua ở giếng, vàng anh dừng lại trên cành cây, bảo nó:

- Phơi áo chồng tao, phơi lao phơi sào, chớ phơi bờ rào, rách áo chồng taọ

Rồi chim vàng anh bay thẳng vào cung rồi đậu ở cửa sổ, hót lên rất vui taịVua đi đâu, chim bay đến đó. Vua đang nhớ Tấm không nguôi, thấy chim quyến luyến theo mình, vua bảo:

- Vàng ảnh vàng anh, có phải vợ anh , chui vào tay áọ

Chim vàng anh bay lại đậu vào tay vua rồi rúc vào tay áọ Vua yêu quý vàng anh quên cả ăn ngủ. Vua sai làm một cái lồng bằng vàng cho chim ở. Từ đó, ngày đêm vua chỉ mải mê với chim, không tưởng đến Cám. 

Cám vội về mách mẹ. Mẹ nó bảo cứ bắt chim làm thịt ăn rồi kiếm điều nói dối vuạ Trở lại cung vua, nhân lúc vua đi vắng, bắt chim làm thịt nấu ăn rồi vứt lông chim ở ngoài vườn.

Thấy mất vàng anh, vua hỏi, Cám đáp:

- Thiếp có mang, thèm ăn thịt chim, nên trộm phép bệ hạ đã giết thịt ăn mất rồị

Vua không nói gì cả. Lông chim vàng anh chôn ở vườn hoá ra hai cây soan đàọ Khi vua đi chơi vườn ngự, cành lá của chúng sà xuống che kín thành bóng, nư hai cái lọng. Vua thấy cây đẹp rợp bóng, sai lính hầu mắc vọng vào hai cây rồi nằm chơi hóng mát. Khi vua đi khỏi thì cành cây lại vươn thẳng trở lạị Từ đó, không ngày nào Vua không ra nằm hóng mát ở hai cây xoan đàọ

Cám biết chuyện ấy lại về nhà mách mẹ. Mẹ nó bảo, cứ sai thợ chặt cây làm khung cửi rồi kiếm điều nói dối vuạ Về đến cung, nhân một hôm gió bão, Cám sai thợ chặt cây xoan đào lấy gỗ đóng khung cửị Thấy cây bị chặt, vua hỏi thì Cám đáp:

- Cây bị đổ vì bão, thiếp sai thợ chặt làm khung cửi để dệt áo cho bệ hạ.

Nhưng khi khng cửi đóng xong. Cám ngồi vào dệt lúc nào cũng nghe thấy tiếng khung cửi rủa mình :

Cót ca cót két

Lấy tranh chồng chị.

Chị khoét mắt ra

Thấy vậy Cám sợ hãi, vội về nhà mách mẹ. Mẹ nó bảo đốt quách khung cửi, rồi đem tro đi đổ cho rõ xa để được yên tâm. Về đến cung, Cám làm như lời mẹ nóị Nó đem tro đã đốt đem đi đổ ở lề đường cách xa hoàng cung. Đống tro bên đường lại mọc lên một cây thị cao lớn, cành lá xum xuệ Đến mùa có quả, cây thị chỉ đậu được có một quả, nhưng mùi thơm ngát toả ra khắp nơị Một bà lão hàng nước gần đó có một hôm đi qua dưới gốc, ngửi thấy mùi thơm, ngẩng đầu nhìn lên thấy quả thị trên cành cao, bèn giơ bị ra nói lẩm bẩm: 

- Thị ơi thị, rụng vào bị bà, bà đem bà ngửi chứ bà không ăn. 

Bà lão nói vừa dứt lời, thì quả thị rụng ngay xuống đúng vào bị. Bà lão nâng niu đem về nhà cất trong buồng, thỉng thoảng lại vào ngắm nghía và ngửi mùi thơm.

Ngày nào bà lão cũng đi chợ vắng. Từ trong quả thị chui ra một cô gái thân hình bé nhỏ như ngón tay, nhưng chỉ trong chớp mắt đã biến thành Tấm. Tấm vừa bước ra đã cầm lấy chổi quét dọn nhà cửa sạch sẽ, rồi đi vo gạo thổi cơm, hái rau ở vườn nấu canh giúp bà hàng nước. Đoạn Tấm lại thu hình bé nhỏ như cũ rồi chui vào quả thị. Lần nào đi chợ về, bà lão cũng thấy nhà cửa ngăn nắp, cơm ngon, canh ngọt sẵn sàng, thì lấy làm lạ.

Một hôm bà hàng nước giả vờ đi chợ, đến nửa đường lại lén trở về, rình ở bụi cây sau nhà. Trong khi đó, Tấm từ quả thị chui ra rồi cũng làm việc như mọi lần. Bà lão rón rén lại nhìn vào khe cửạ Khi thấy cô gái xinh đẹp thì bà mừng quá, bất thình lình xô cửa vào ôm choàng lấy Tấm, đoạn xé vụn vỏ thị. Từ đó Tấm ở với bà hàng nước, hai người thương nhau như hai mẹ con. Hàng ngày Tấm giúp bà lão các việc thổi cơm, nấu nước, gói bánh, têm trầu để cho bà bán hàng.

Một hôm vua đi chơi ra khỏi hoàng cung, Thấy có quán nước bên đường sạch sẽ , bèn ghé vàọ Bà lão mang trầu nước dâng lên vuạ Thấy trầu têm cánh phượng, vua sực nhớ tới trầu vợ mình têm ngày trước cũng y như vậy, liền phán hỏi :

- Trầu này ai têm?

- Trầu này con gái lão têm - bà lão đáp.

- Con gái của bà đâu, gọi ra đây cho ta xem mặt.

Bà lão gọi Tấm rạ Tấm vừa xuất hiện, vua nhận ra ngay vợ mình ngày trước, có phần trẻ đẹp hơn xưạ Vua mừng quá, bảo bà lão hàng nước kể lại sự tình, rồi truyền cho quân hầu đưa kiệu rước Tấm về cung.

Cám Thấy Tấm trở về và được vua yêu thương như xưa, thì nó không khỏi sợ hãị Một hôm, Cám hỏi chị :

- Chị Tấm ơi, chị Tấm! chị làm thế nào mà đẹp thế ?

Tấm không đáp, chỉ hỏi lại:

- Có muốn đẹp không để chị giúp !

Cám bằng lòng ngaỵ Tấm sai quân hầu đào một cái hố sâu và đun một nồi nước sôị Tấm bảo Cám xuống hố rồi sai quân hầu dội nước sôi vào hố. Cám chết. Tấm sai đem xác làm mắm bỏ vào chĩnh gửi cho mụ dì ghẻ, nói là quà của con gái mụ gửi biếụ Mẹ Cám tưởng thật, lấy mắm ra ăn, bữa nào cũng nức nở khen ngon. Một con quạ ở đâu bay đến đậu trên nóc nhà kêu rằng:

- Ngon ngỏn ngòn ngon ! Mẹ ăn thịt con, có còn xin miếng.

Mẹ Cám giận lắm, chửi mắng rầm rĩ rồi vác sào đuổi quạ. Nhưng đến ngày ăn gần hết, dòm vào chĩnh, mụ thấy đầu lâu của con thì lăn ra chết.

            ";
            var group1 = new SampleDataGroup("Group-1",
                    "Cổ tích",
                    "Những câu chuyện cổ tích hay của Việt Nam",
                    "https://lh6.googleusercontent.com/-9OwEnxkwSkA/UGVezzXN2xI/AAAAAAAAAD8/bug5hIiN-bE/s512/tamcam.jpg",
                    "Cổ tích là những câu chuyện mà ai cũng đã từng được tiếp xúc ngày nhỏ, đó là những bài học về cách làm người, lòng nhân đạo,...");
            group1.Items.Add(new SampleDataItem("Group-1-Item-1",
                    "Tấm Cám",
                    "Truyện Tấm Cám",
                    "https://lh6.googleusercontent.com/-9OwEnxkwSkA/UGVezzXN2xI/AAAAAAAAAD8/bug5hIiN-bE/s512/tamcam.jpg",
                    "Tấm cám là một câu chuyện về lòng nhân hậu, bao dung mà mọi đứa trẻ ở việt nam đều phải biết",
                    ITEM_CONTENT,
                    group1));
            group1.Items.Add(new SampleDataItem("Group-1-Item-2",
                    "Item Title: 2",
                    "Item Subtitle: 2",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group1));
            group1.Items.Add(new SampleDataItem("Group-1-Item-3",
                    "Item Title: 3",
                    "Item Subtitle: 3",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group1));
            group1.Items.Add(new SampleDataItem("Group-1-Item-4",
                    "Item Title: 4",
                    "Item Subtitle: 4",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group1));
            group1.Items.Add(new SampleDataItem("Group-1-Item-5",
                    "Item Title: 5",
                    "Item Subtitle: 5",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group1));
            this.AllGroups.Add(group1);

            var group2 = new SampleDataGroup("Group-2",
                    "Group Title: 2",
                    "Group Subtitle: 2",
                    "Assets/LightGray.png",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante");
            group2.Items.Add(new SampleDataItem("Group-2-Item-1",
                    "Item Title: 1",
                    "Item Subtitle: 1",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group2));
            group2.Items.Add(new SampleDataItem("Group-2-Item-2",
                    "Item Title: 2",
                    "Item Subtitle: 2",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group2));
            group2.Items.Add(new SampleDataItem("Group-2-Item-3",
                    "Item Title: 3",
                    "Item Subtitle: 3",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group2));
            this.AllGroups.Add(group2);

            var group3 = new SampleDataGroup("Group-3",
                    "Group Title: 3",
                    "Group Subtitle: 3",
                    "Assets/MediumGray.png",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante");
            group3.Items.Add(new SampleDataItem("Group-3-Item-1",
                    "Item Title: 1",
                    "Item Subtitle: 1",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            group3.Items.Add(new SampleDataItem("Group-3-Item-2",
                    "Item Title: 2",
                    "Item Subtitle: 2",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            group3.Items.Add(new SampleDataItem("Group-3-Item-3",
                    "Item Title: 3",
                    "Item Subtitle: 3",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            group3.Items.Add(new SampleDataItem("Group-3-Item-4",
                    "Item Title: 4",
                    "Item Subtitle: 4",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            group3.Items.Add(new SampleDataItem("Group-3-Item-5",
                    "Item Title: 5",
                    "Item Subtitle: 5",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            group3.Items.Add(new SampleDataItem("Group-3-Item-6",
                    "Item Title: 6",
                    "Item Subtitle: 6",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            group3.Items.Add(new SampleDataItem("Group-3-Item-7",
                    "Item Title: 7",
                    "Item Subtitle: 7",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group3));
            this.AllGroups.Add(group3);

            var group4 = new SampleDataGroup("Group-4",
                    "Group Title: 4",
                    "Group Subtitle: 4",
                    "Assets/LightGray.png",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante");
            group4.Items.Add(new SampleDataItem("Group-4-Item-1",
                    "Item Title: 1",
                    "Item Subtitle: 1",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group4));
            group4.Items.Add(new SampleDataItem("Group-4-Item-2",
                    "Item Title: 2",
                    "Item Subtitle: 2",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group4));
            group4.Items.Add(new SampleDataItem("Group-4-Item-3",
                    "Item Title: 3",
                    "Item Subtitle: 3",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group4));
            group4.Items.Add(new SampleDataItem("Group-4-Item-4",
                    "Item Title: 4",
                    "Item Subtitle: 4",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group4));
            group4.Items.Add(new SampleDataItem("Group-4-Item-5",
                    "Item Title: 5",
                    "Item Subtitle: 5",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group4));
            group4.Items.Add(new SampleDataItem("Group-4-Item-6",
                    "Item Title: 6",
                    "Item Subtitle: 6",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group4));
            this.AllGroups.Add(group4);

            var group5 = new SampleDataGroup("Group-5",
                    "Group Title: 5",
                    "Group Subtitle: 5",
                    "Assets/MediumGray.png",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante");
            group5.Items.Add(new SampleDataItem("Group-5-Item-1",
                    "Item Title: 1",
                    "Item Subtitle: 1",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group5));
            group5.Items.Add(new SampleDataItem("Group-5-Item-2",
                    "Item Title: 2",
                    "Item Subtitle: 2",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group5));
            group5.Items.Add(new SampleDataItem("Group-5-Item-3",
                    "Item Title: 3",
                    "Item Subtitle: 3",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group5));
            group5.Items.Add(new SampleDataItem("Group-5-Item-4",
                    "Item Title: 4",
                    "Item Subtitle: 4",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group5));
            this.AllGroups.Add(group5);

            var group6 = new SampleDataGroup("Group-6",
                    "Group Title: 6",
                    "Group Subtitle: 6",
                    "Assets/DarkGray.png",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante");
            group6.Items.Add(new SampleDataItem("Group-6-Item-1",
                    "Item Title: 1",
                    "Item Subtitle: 1",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-2",
                    "Item Title: 2",
                    "Item Subtitle: 2",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-3",
                    "Item Title: 3",
                    "Item Subtitle: 3",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-4",
                    "Item Title: 4",
                    "Item Subtitle: 4",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-5",
                    "Item Title: 5",
                    "Item Subtitle: 5",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-6",
                    "Item Title: 6",
                    "Item Subtitle: 6",
                    "Assets/MediumGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-7",
                    "Item Title: 7",
                    "Item Subtitle: 7",
                    "Assets/DarkGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            group6.Items.Add(new SampleDataItem("Group-6-Item-8",
                    "Item Title: 8",
                    "Item Subtitle: 8",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group6));
            this.AllGroups.Add(group6);
        }

        public SampleDataSource()
        {
            
        }

        public void UpdateStatus(bool status)
        {
            if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.ContainsKey("IsSaved"))
            {
               
                    Windows.Storage.ApplicationData.Current.LocalSettings.Values["IsSaved"] = status;
             
            }
            else
            {
                Windows.Storage.ApplicationData.Current.LocalSettings.CreateContainer("IsSaved", ApplicationDataCreateDisposition.Always);
                if (Windows.Storage.ApplicationData.Current.LocalSettings.Values["IsSaved"] == null)
                {
                    Windows.Storage.ApplicationData.Current.LocalSettings.Values["IsSaved"] = status;
                }

            }


        }

        public async void SaveToFile()
        {

            UpdateStatus(true);
            StorageFolder folder = ApplicationData.Current.LocalFolder;
            StorageFile myFile = await folder.CreateFileAsync("data.xml", CreationCollisionOption.ReplaceExisting);
            
            


                //XmlSerializer serializer = new XmlSerializer(this.AllGroups.GetType());
                //serializer.Serialize(myFile, this);
            
           
        }

    }


    public class DataLoading
    {
        VietnamStoriesClient client;

        public async void Load()
        {
           
            

            try
            {
                client = new VietnamStoriesClient();
                var re = client.GetDataSourceAsync();

                VNStories_DataSource source = re.Result;

                if (source == null) OnLoadingError("Network");
                
                if (source.Groups.Count <= 0) OnLoadingError("NoData");

                StoriesDataSource ds = new StoriesDataSource();
                foreach (VNStories_Category c in source.Groups)
                {
                    SampleDataGroup g = new SampleDataGroup("Group-" + c.ID, c.Name, c.Subtitle, c.Thumbnail, c.Description);
                    g.Items = new ObservableCollection<SampleDataItem>();
                    ds.AllGroups.Add(g);
                    if (c.Stories == null) continue;
                    if (c.Stories.Count <= 0) continue;

                    for (int i = 0; i < c.Stories.Count; i++)
                    {
                        SampleDataItem s = new SampleDataItem("Group-" + c.ID + "-Item-" + c.Stories[i].ID, c.Stories[i].Name, c.Stories[i].Author, c.Stories[i].Thumb, c.Stories[i].Author, c.Stories[i].Content, g);
                        if (i < 6) g.TopItems.Add(s);
                        g.Items.Add(s);
                    }
                   

                }

                OnDataLoaded(ds);
                
            }
            catch (Exception e)
            {
                OnLoadingError(e.Message);
            }

            
           
        }

        public async void SaveToFile()
        {
            Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
            Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

            StorageFile file =   await ApplicationData.Current.LocalFolder.CreateFileAsync("data.xml", CreationCollisionOption.ReplaceExisting);



        }


        public delegate void LoadedHandler(StoriesDataSource data);
        public event LoadedHandler OnDataLoaded;

        public delegate void LoadedErrorHandler(string message);
        public event LoadedErrorHandler OnLoadingError;

    }





    
    public class StoriesDataSource
    {

        [DataMember()]
        private ObservableCollection<SampleDataGroup> _allGroups = new ObservableCollection<SampleDataGroup>();
        [DataMember()]
        public ObservableCollection<SampleDataGroup> AllGroups
        {
            get { return this._allGroups; }
            set { _allGroups = value; }
        }

        public IEnumerable<SampleDataGroup> GetGroups(string uniqueId)
        {
            if (!uniqueId.Equals("AllGroups")) throw new ArgumentException("Only 'AllGroups' is supported as a collection of groups");

            return this.AllGroups;
        }

        public SampleDataGroup GetGroup(string uniqueId)
        {
            // Simple linear search is acceptable for small data sets
            var matches = this.AllGroups.Where((group) => group.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public SampleDataItem GetItem(string uniqueId)
        {
            // Simple linear search is acceptable for small data sets
            var matches = this.AllGroups.SelectMany(group => group.Items).Where((item) => item.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }



        public StoriesDataSource()
        {
            _allGroups = new ObservableCollection<SampleDataGroup>();
        }


    }


    public class LocalStorage
    {
        private static List<object> _data = new List<object>();

        public static List<object> Data
        {
            get { return _data; }
            set { _data = value; }
        }

        public static StorageFile file { get; set; }

        private const string filename = "data.xml";

        static async public Task Save<T>()
        {
            if (await DoesFileExistAsync(filename))
            {
                await Windows.System.Threading.ThreadPool.RunAsync((sender) => LocalStorage.SaveAsync<T>().Wait(), Windows.System.Threading.WorkItemPriority.Normal);
            }
            else
            {
                file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            }
        }

        static async public Task Restore<T>()
        {
            if (await DoesFileExistAsync(filename))
            {
                await Windows.System.Threading.ThreadPool.RunAsync((sender) => LocalStorage.RestoreAsync<T>().Wait(), Windows.System.Threading.WorkItemPriority.Normal);
            }
            else
            {
                file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename);
            }
        }

        static async Task<bool> DoesFileExistAsync(string fileName)
        {
            try
            {
                await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
                return true;
            }
            catch
            {
                return false;
            }
        }

        static async private Task SaveAsync<T>()
        {
            StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite);
            IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0);
            var serializer = new XmlSerializer(typeof(List<object>), new Type[] { typeof(T) });

            //Using DataContractSerializer , look at the cat-class
            //var sessionSerializer = new DataContractSerializer(typeof(List<object>), new Type[] { typeof(T) });
            //sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data);

            //Using XmlSerializer , look at the Dog-class
            serializer.Serialize(sessionOutputStream.AsStreamForWrite(), _data);
            sessionRandomAccess.Dispose();
            await sessionOutputStream.FlushAsync();
            sessionOutputStream.Dispose();
        }

        static async private Task RestoreAsync<T>()
        {
            StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists);
            if (sessionFile == null)
            {
                return;
            }
            IInputStream sessionInputStream = await sessionFile.OpenReadAsync();

            //Using DataContractSerializer , look at the cat-class
            // var sessionSerializer = new DataContractSerializer(typeof(List<object>), new Type[] { typeof(T) });
            //_data = (List<object>)sessionSerializer.ReadObject(sessionInputStream.AsStreamForRead());

            //Using XmlSerializer , look at the Dog-class
            var serializer = new XmlSerializer(typeof(List<object>), new Type[] { typeof(T) });
            _data = (List<object>)serializer.Deserialize(sessionInputStream.AsStreamForRead());
            sessionInputStream.Dispose();
        }
    }
}
